package com.atguigu.yygh.hosp.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.yygh.hosp.repository.DepartmentRepository;
import com.atguigu.yygh.hosp.service.DepartmentService;
import com.atguigu.yygh.model.hosp.Department;
import com.atguigu.yygh.vo.hosp.DepartmentQueryVo;
import com.atguigu.yygh.vo.hosp.DepartmentVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author zfj
 * @date 2024/4/8 -10:23
 */
@Service
public class DepartmentServiceImpl implements DepartmentService {
	@Autowired
	private DepartmentRepository departmentRepository;

	@Override
	public void save(Map<String, Object> paramMap) {
		Department department = JSONObject.parseObject(JSONObject.toJSONString(paramMap), Department.class);
		Department targetDepartment = departmentRepository.getDepartmentByHoscodeAndDepcode(department.getHoscode(), department.getDepcode());
		if (null != targetDepartment) {
			BeanUtils.copyProperties(department, targetDepartment, Department.class);
			departmentRepository.save(targetDepartment);
		} else {
			department.setCreateTime(new Date());
			department.setUpdateTime(new Date());
			department.setIsDeleted(0);
			departmentRepository.save(department);
		}
	}

	@Override
	public Page<Department> findPageDepartment(int page, int limit, DepartmentQueryVo departmentQueryVo) {
		Sort sort = Sort.by(Sort.Direction.DESC, "createTime");
		// 0 为第一页
		Pageable pageable = PageRequest.of(page - 1, limit, sort);

		Department department = new Department();
		BeanUtils.copyProperties(departmentQueryVo, department);
		department.setIsDeleted(0);

		// 创建匹配器，即如何使用查询条件
		ExampleMatcher matcher = ExampleMatcher.matching()
				// 改变默认字符串匹配方式：模糊查询
				.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)
				// 改变默认大小写忽略方式：忽略大小写
				.withIgnoreCase(true);

		// 创建实例
		Example<Department> example = Example.of(department, matcher);
		return departmentRepository.findAll(example, pageable);
	}

	@Override
	public void remove(String hoscode, String depcode) {
		Department department = departmentRepository.getDepartmentByHoscodeAndDepcode(hoscode, depcode);
		if (null != department) {
			// departmentRepository.delete(department);
			departmentRepository.deleteById(department.getId());
		}
	}

	//查询医院所有科室列表
	@Override
	public List<DepartmentVo> findDeptTree(String hoscode) {
		//创建list集合，用于封装
		List<DepartmentVo> result=new ArrayList<>();
		//根据医院编号，查询医院所有课室信息
		Department departmentQuery = new Department();
		departmentQuery.setHoscode(hoscode);
		Example<Department> example = Example.of(departmentQuery);
		//所有科室列表信息
		List<Department> departmentList = departmentRepository.findAll(example);
		//根据大可是编号分组，获取每个大科室下的子科室
		Map<String, List<Department>> departmentMap = departmentList.stream().collect(Collectors.groupingBy(Department::getBigcode));
		//遍历departmentMap
		for(Map.Entry<String, List<Department>> entry:departmentMap.entrySet()){
			//大科室编号
			String bigcode=entry.getKey();
			//大科室对应的全部数据
			List<Department> departmentList1 = entry.getValue();
			//分装大科室
			DepartmentVo departmentVo1 = new DepartmentVo();
			departmentVo1.setDepcode(bigcode);
			departmentVo1.setDepname(departmentList1.get(0).getBigname());
			//分装小科室
			List<DepartmentVo> children =new ArrayList<>();
			for(Department department:departmentList1){
				DepartmentVo departmentVo2 = new DepartmentVo();
				departmentVo2.setDepcode(department.getDepcode());
				departmentVo2.setDepname(department.getDepname());
				//分装
				children.add(departmentVo2);
			}
			//把小科室list放到大科室children中
			departmentVo1.setChildren(children);
			//放到最终result中
			result.add(departmentVo1);
		}
		return result;
	}

	@Override
	public String getDepName(String hoscode, String depcode) {
		Department department = departmentRepository.getDepartmentByHoscodeAndDepcode(hoscode, depcode);
		if (department != null) {
			return department.getDepname();
		}
		return null;
	}
}
